package ca.etsmtl.log430.lab3;

import java.util.Observable;

public class ListCoursesTaken extends Communication implements Runnable {
	boolean Stop = false;

	public ListCoursesTaken(Integer RegistrationNumber, String ComponentName) {
		super(RegistrationNumber, ComponentName);

	} // Constructor

	@Override
	public void update(Observable thing, Object notificationNumber) {
		boolean done, done2;
		Course CurrentObject = null;
		Menus Menu = new Menus();
		Displays Display = new Displays();
		Student MyStudent = new Student();
		// The update() method is an abstract method that is called whenever the
		// notifyObservers() method is called by the Observable class
		// First we check to see if the NotificationNumber is equal to this
		// thread's RegistrationNumber or SYSTEM_SHUT_DOWN. If they are, then we
		// execute - otherwise, we stay idle.

		done = false;
		done2 = false;

		if (registrationNumber.compareTo((Integer) notificationNumber) == 0) {
			// First we use a Displays object to list all of the students. Then
			// we
			// ask the user to pick a student using a Menus object.

			addToReceiverList("ListStudentsComponent");

			signalReceivers("ListStudentsComponent");

			MyStudent = Menu
					.pickStudent(CommonData.theListOfStudents.listOfStudents);

			// If the user selected an invalid student, then a message is
			// printed to the
			// terminal.

			if (MyStudent != null) {

				CourseList CoursesTaken = new CourseList();
				CourseList compulsoryCourses = CommonData.theListOfCourses
						.getListOfCourses();
				Course CourseObject = null;

				MyStudent.getCoursesTakenList().goToFrontOfList();
				while (!done) {
					done2 = false;
					CurrentObject = MyStudent.getCoursesTakenList()
							.getNextCourse();
					if (CurrentObject == null) {
						done = true;
					} else {

						compulsoryCourses.goToFrontOfList();
						while (!done2) {
							CourseObject = compulsoryCourses.getNextCourse();
							if (CourseObject == null) {
								done2 = true;
							} else {
								if (CurrentObject.getCourseID()
										.compareToIgnoreCase(
												CourseObject.getCourseID()) == 0) {
									CurrentObject.setCourseName(CourseObject
											.getCourseName());
									done2 = true;
								}
							}
						}
						if (CurrentObject.getCourseName() == null)
							CurrentObject.setCourseName("Cours sans nom");
						CoursesTaken.addCourse(CurrentObject);
					}

				}

				Display.displayStudentCoursesTaken(MyStudent);
			} else {

				System.out.println("\n\n *** Student not found ***");

			} // if

		} // if

		if (SYSTEM_SHUT_DOWN_ID.compareTo((Integer) notificationNumber) == 0) {
			Stop = true;

		}

	} // update

	public void run() {
		System.out.println("\nListCoursesTaken Component Started...");

		try {
			while (!Stop) {

				// Note this is something of a farce here. In order to start
				// each
				// component as a separate thread, the run() method must be
				// implemented.
				// To illustrate how run() could be used here I put some code
				// here.We really
				// don't do anything here,.. but we could. If we were doing
				// things here,
				// whatever it was that we were doing would be interrupted when
				// an event
				// from the executive arrived, and the update() method we would
				// immediately
				// execute. Currently we wait forever (by 1 second increments).
				// Please feel
				// free to put code if if you thing you need to (not to imply
				// that you will
				// need to).

				Thread.sleep(1000);

			} // while

			System.out.println("\nListCoursesTaken Component Shutdown...");

		} catch (Exception e) {

			System.out.println("Exception occured in ListCoursesTaken.run(): "
					+ e);

		} // try-catch

	} // run
}
